package com.arpa.oms.service;

import com.arpa.core.web.Result;
import com.arpa.oms.domain.dto.OmsSaleExcelDTO;
import com.arpa.oms.domain.dto.SaleDto;
import com.arpa.oms.domain.dto.SaleItemDto;
import com.arpa.oms.domain.entity.Sale;
import com.arpa.oms.domain.vo.OmsSaleExcelVO;
import com.arpa.oms.domain.vo.SaleItemVO;
import com.arpa.oms.domain.vo.SaleVO;
import com.arpa.wms.domain.entity.Outbound;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

/**
 * <p>
 * OMS销售单服务类
 * </p>
 *
 * @author LEO
 * @since 2020-10-22
 */
@Validated
public interface ISaleService extends IService<Sale> {



    /**
     * 查询列表
     *
     * @param dto
     * @return
     */
    List<SaleVO> queryList(SaleDto dto);

    /**
     * 查询合计,包含总数
     *
     * @param dto
     * @return
     */
    SaleVO queryListSum(SaleDto dto);

    /**
     * 通过code查询销售单详细信息
     * @param code 销售单号
     * @return
     */
    SaleVO getByCode(String code);

    /**
     * 销售单作废
     * @param code 销售单号
     */
    void annul(String code);

    /**
     * 创建销售单
     * @param purchase
     */
    void create(@Valid Sale purchase);

    /**
     * 提交销售单
     * @param sale
     */
    void submit(Sale sale);

    /**
     * 审核销售单
     * @param sale
     * @param status
     * @param verifyOpinion
     */
    Future<Boolean> audit(Sale sale, String status, String verifyOpinion);

    /**
     * wms完成后，根据已更新的销售单明细更新销售单的实际出库数量（销售单位、基本单位）
     * @param code
     */
    void afterWmsUpdateQuantity(String code);

    /**
     * 根据销售单号，释放所有占用库存；情况包括：
     * 1. 销售单审核不通过；
     * 2. wms中断出库，在库存分配环节，分配为空-》不生成拣货单，流程结束；
     * 3. wms中断出库，在拣货单确认环节，退减所有库存-》不生成出库单，流程结束；
     *
     * @param saleCodes
     */
    void releaseUseQuantity(List<String> saleCodes);

    /**
     * @description
     * 获取可退销售单列表
     * @author xuyang
     * @date 2020/12/14 11:28
     * @param dto:
     **/
    List<Sale> findCanRefundList(SaleDto dto);

    /**
     * @description
     * wms根据销售单生成oms出库单
     * @author xuyang
     * @date 2020/12/15 14:55
     * @param sourceCode:
     **/
    void wmsSaveOmsOutboundBySale(String sourceCode, Outbound outbound, Map<String, BigDecimal[]> sourceItemOutQuantity);

    int updateByCode(Sale sale);

    /**
     * @description
     * 保存主单及明细
     * @author xuyang
     * @date 2020/12/16 14:31
     * @param sale:
     **/
    Result localSave(Sale sale);

    /**
     * @description
     * 获取可退货销售单明细
     * @author xuyang
     * @date 2020/12/21 9:29
     * @param dto:
     **/
    List<SaleItemVO> findCanRefundItemList(SaleItemDto dto);

    /**
     * @description
     * 计算销售单、销售单明细的数据，如金额、欠款数额等
     * @author xuyang
     * @date 2020/12/21 18:45
     * @param entity:
     * @param usePlanQuantityFlag: true时使用计划数量计算；false使用实际数量计算
     **/
    void calcQuantity(Sale entity, boolean usePlanQuantityFlag);

    /**
     * 更新销售表的退货数量
     * @param saleCode
     */
    void refreshOmsSaleRefundQuantity(String saleCode);

    /**
     * 合并店铺，仓库，承运商，买家姓名、电话、地址完全一致单据
     * @param codes
     * @return
     */
    Integer merge(List<String> codes);

    /**
     * 审核退回
     * @param codes
     * @return
     */
    boolean back(List<String> codes);


    /**
     * 自动审核销售单
     * @param saleList
     */
    void autoAudit(List<Sale> saleList);

    /**
     * 销售单导入预览
     * @param list
     * @return
     */
    List<OmsSaleExcelVO> saleExcelView(List<OmsSaleExcelDTO> list);

    /**
     * 销售单导入
     * @param importCode
     * @return
     */
    Result importSale(String importCode);

    int updateSaleByCode(Sale sale);

    void updateSaleItem(Sale sale);

    boolean validateIsAutoAudit(Sale sale);
}
